package com.cn.kabalifeuser.base;

import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;

import com.cn.kabalifeuser.R;
import com.cn.kabalifeuser.utils.RxToast;
import com.gyf.barlibrary.ImmersionBar;

import butterknife.ButterKnife;
import butterknife.Unbinder;
import rx.Subscription;


public abstract class IBaseActivity<V, T extends BasePresenter<V>> extends AppCompatActivity {


    protected T mPresenter;
    //RxBus
    protected Subscription rxBusSubscription;
    private Unbinder unbinder;

    //状态栏
    protected ImmersionBar mImmersionBar;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //禁止横竖屏切换 固定竖屏
//        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        MyApplication.getInstance().getActivityManager().pushActivity(this);
        //初始化状态栏
        if (isImmersionBarEnabled()) {
            initImmersionBar();
        }
        //判断是否使用MVP模式
        mPresenter = createPresenter();
        if (mPresenter != null) {
            mPresenter.attachView((V) this);//因为之后所有的子类都要实现对应的View接口
        }

        //子类不再需要设置布局ID，也不再需要使用ButterKnife.bind()

        setContentView(provideContentViewId());
        unbinder = ButterKnife.bind(this);
        beforeInitView();
        initView(savedInstanceState);
        initRefreshLayout();
        initRxtBus();
        initData();
    }

    private boolean isImmersionBarEnabled() {
        return true;
    }

    public void initImmersionBar() {
        //在BaseActivity里初始化
        mImmersionBar = ImmersionBar.with(this)
//                .statusBarColor(R.color.white)
                .statusBarDarkFont(true, 0.2f);
        mImmersionBar.init();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
//        if (mPresenter != null) {
//            mPresenter.attachView((V) this);
//        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
        if (unbinder != null) {
            unbinder.unbind();
        }
        //在BaseActivity里销毁
        if (mImmersionBar != null) {
            mImmersionBar.destroy();
        }
        //取消RxBus订阅
        if (rxBusSubscription != null) {
            rxBusSubscription.unsubscribe();
            rxBusSubscription = null;
        }
    }

    //在setContentView()调用之前调用，可以设置WindowFeature(如：this.requestWindowFeature(Window.FEATURE_NO_TITLE);)
    public void beforeInitView() {
    }

    public void initView(Bundle savedInstanceState) {
    }

    public void initRefreshLayout() {
    }

    public void initRxtBus() {

    }

    public void initData() {
    }


    //用于创建Presenter和判断是否使用MVP模式(由子类实现)
    protected abstract T createPresenter();

    //得到当前界面的布局文件id(由子类实现)
    protected abstract int provideContentViewId();


    /**
     * 关闭界面，重写了系统的方法，在里面增加了系统Activity堆栈管理功能
     */
    @Override
    public void finish() {
        MyApplication.getInstance().getActivityManager().popActivity(this);
        super.finish();
    }

    /**
     * 关闭除指定界面以外的所有Activity
     *
     * @param cls 指定界面
     */
    public void finishAllExt(Class<?> cls) {
        MyApplication.getInstance().getActivityManager().popAllActivityExceptOne(cls);
    }

    /**
     * 关闭所有Activity
     */
    public void finishAll() {
        MyApplication.getInstance().getActivityManager().popAllActivity();
    }

    /**
     * 使用Activity.this的地方统一使用getMe替代
     *
     * @return
     */
    public Context getMe() {
        return this;
    }

    //top的toolbar
    public TextView top_tv_status_bar;  //状态栏
    public RelativeLayout top_toobar_view;//整体布局
    public RelativeLayout top_left_view, top_right_view;//左右的布局
    public TextView top_title;//中间标题
    public TextView top_left_text, top_right_text;//左右文字 text
    public ImageView top_left_image, top_right_image;//左右图标

    public RelativeLayout top_right_r_view;//新加的。右布局旁边
    public ImageView top_right_r_image;//新加的。右布局旁边

    /**
     * 页数
     */
    public int pagehttp = 1;
    /**
     * 显示的数据条数
     */
    public int pageNum = 10;
    /**
     * 是否刷新
     * true 说明有下一页
     */
    public boolean isRefresh = true;

    /**
     * findViewById
     *
     * @param resId
     * @param <T>
     * @return
     */
    public <T extends View> T $findViewById(int resId) {
        return (T) findViewById(resId);
    }

    /**
     * top的ToolBar初始化
     */
    public void initToolBar() {
        top_tv_status_bar = $findViewById(R.id.top_tv_status_bar);  //状态栏
        top_toobar_view = $findViewById(R.id.top_toobar_view);//整体布局
        top_left_view = $findViewById(R.id.top_left_view); //左区域
        top_right_view = $findViewById(R.id.top_right_view);//右区域
        top_title = $findViewById(R.id.top_title);//中间标题
        top_left_text = $findViewById(R.id.top_left_text);
        top_right_text = $findViewById(R.id.top_right_text);//左右文字 text
        top_left_image = $findViewById(R.id.top_left_image);
        top_right_image = $findViewById(R.id.top_right_image);//左右图标
        //新加的。右布局旁边
        top_right_r_view = $findViewById(R.id.top_right_r_view);//新加的。右布局旁边
        top_right_r_image = $findViewById(R.id.top_right_r_image);


    }
    //如需要左侧文字或者右侧图片、文字的话。补上即可。

    /**
     * 左侧返回 中间标题
     */
    public void setTitleBar(@StringRes int title) {
        initToolBar();
        top_title.setText(getString(title));
        mLeftClick();
    }

    //左侧返回 中间标题
    public void setTitleBar(String title) {
        initToolBar();
        top_title.setText(title);
        mLeftClick();
    }

    /**
     * 就左边返回
     */
    public void setLeftView() {
        initToolBar();
        mLeftClick();
    }


    /**
     * 中间文字。一般來說调这个必调 setLeftView
     *
     * @param title
     */
    public void setLeftViewTitle(String title) {
        top_title.setText(title);
    }

    /**
     * 左侧点击返回
     */
    public void mLeftClick() {
        top_left_view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                leftFinish();
            }
        });
    }

    /**
     * 左侧返回,关闭当前 finish
     * 如果只需要返回的情况下不需要覆写
     */
    public void leftFinish() {
        finish();
    }

    /**
     * 左侧返回 中间标题 右边文字
     */
    public void setTitleBarRight(@StringRes int title, @StringRes int rightStr) {
        initToolBar();
        top_title.setText(getString(title));
        top_right_text.setVisibility(View.VISIBLE);
        top_right_text.setText(getString(rightStr));
        mLeftClick();
        mRightClick();
    }

    /**
     * 左侧返回 中间标题 右边文字
     */
    public void setTitleBarRight(String title, String rightStr) {
        initToolBar();
        top_title.setText(title);
        top_right_text.setVisibility(View.VISIBLE);
        top_right_text.setText(rightStr);
        mLeftClick();
        mRightClick();
    }

    /**
     * 左侧返回 中间标题 右边图片
     */
    public void setTitleBarRightImage(String title, int imageId) {
        initToolBar();
        top_title.setText(title);
        top_right_image.setVisibility(View.VISIBLE);
        top_right_image.setImageResource(imageId);
        mLeftClick();
        mRightClick();
    }

    /**
     * 右侧点击事件
     */
    public void mRightClick() {
        top_right_view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                rightClick();
            }
        });
    }

    /**
     * 右侧点击
     * 得需要重写
     */
    public void rightClick() {
    }


    /**
     * 跳转
     *
     * @param cls
     */
    protected void $startActivity(Class<?> cls) {
        $startActivity(cls, null);
    }

    /**
     * 跳转传参数
     *
     * @param cls
     * @param bundle
     */
    protected void $startActivity(Class<?> cls, Bundle bundle) {
        Intent intent = new Intent(this, cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
    }

    /**
     * 跳转
     * finish
     *
     * @param cls
     */
    protected void $startActivityFinish(Class<?> cls) {
        $startActivityFinish(cls, null);
    }

    /**
     * 跳转传参数
     * finish
     *
     * @param cls
     * @param bundle
     */
    protected void $startActivityFinish(Class<?> cls, Bundle bundle) {
        Intent intent = new Intent(this, cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
        finish();
    }


    protected void hideKeyboard(View view) {
        InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }

    public static void HideSoftKeyBoardDialog(Activity activity) {
        try {
            InputMethodManager imm = (InputMethodManager) activity.getSystemService(activity.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
        } catch (Exception ex) {
        }
    }
//

    /**
     * 复制
     *
     * @param context
     * @param copyField
     */

    public static void CopyToClipboard(Context context, String copyField) {
        ClipData myClip = ClipData.newPlainText("text", copyField);
        ClipboardManager myClipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
        myClipboard.setPrimaryClip(myClip);
//            Toast.makeText(context, "复制成功", Toast.LENGTH_LONG).show();
        RxToast.success("复制成功");
    }

    /**
     * pw消失隐藏软键盘
     *
     * @param context
     * @param view
     */
    public void hintPopInput(final Context context, final View view) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 2);
        }
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
//
//    @Override
//    protected void attachBaseContext(Context newBase) {
//        super.attachBaseContext(LocalManageUtil.setLocal(newBase));
//    }
}
